using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance;
    [Header("#BGM")]
    public AudioClip bgmClip; // BGM音频文件
    public float bgmVolume; // BGM音量
    private AudioSource bgmPlayer; // BGM音频源

    [Header("#音效")]
    public AudioClip[] sfxClips; // SFX音频文件数组
    public float sfxVolume; // SFX音量
    public int channels; // SFX音频源数量
    private AudioSource[] sfxPlayers; // SFX音频源数组
    private int channelIndex; // 当前可用的SFX音频源下标
    public enum Sfx { Dead, Hit, LevelUp = 3, Lose, Melee, Range = 7, Select, Win }

    AudioHighPassFilter bgmEffect;

    void Awake()
    {
        Init(); // 初始化
    }

    void Init()
    {
        instance = this;

        // BGM的设置
        GameObject bgmObject = new GameObject("BgmPlayer"); // 创建BGM音频源游戏对象
        bgmObject.transform.parent = transform; // 将游戏对象的父对象设置为AudioManager
        bgmPlayer = bgmObject.AddComponent<AudioSource>(); // 添加AudioSource组件
        bgmPlayer.playOnAwake = false; // 不自动播放
        bgmPlayer.loop = true; // 循环播放
        bgmPlayer.volume = bgmVolume; // 设置音量
        bgmPlayer.clip = bgmClip; // 设置音频文件

        bgmEffect = Camera.main.GetComponent<AudioHighPassFilter>();

        // 音效的设置
        GameObject sfxObject = new GameObject("SfxPlayer"); // 创建SFX音频源游戏对象
        sfxObject.transform.parent = transform; // 将游戏对象的父对象设置为AudioManager
        sfxPlayers = new AudioSource[channels]; // 初始化SFX音频源数组
        for (int index = 0; index < sfxPlayers.Length; index++)
        {
            sfxPlayers[index] = sfxObject.AddComponent<AudioSource>(); // 添加AudioSource组件
            sfxPlayers[index].playOnAwake = false; // 不自动播放
            sfxPlayers[index].bypassListenerEffects = true;
            sfxPlayers[index].volume = sfxVolume; // 设置音量
        }
    }

    public void EffectBgm(bool isPlay)
    {
        bgmEffect.enabled = isPlay;
    }

    //播放音效
    public void PlaySfx(Sfx sfx)
    {
        for (int index = 0; index < sfxPlayers.Length; index++)
        {
            int loopIndex = (index + channelIndex) % sfxPlayers.Length; // 计算循环索引

            if (sfxPlayers[loopIndex].isPlaying)
                continue; // 如果当前声音播放器正在播放，则跳过，继续下一个声音播放器

            int ranIndex = 0;
            if (sfx == Sfx.Hit || sfx == Sfx.Melee)
            {
                ranIndex = Random.Range(0, 2);
            }

            channelIndex = loopIndex; // 更新当前的通道索引为找到的空闲声音播放器的索引
            sfxPlayers[loopIndex].clip = sfxClips[(int)sfx + ranIndex]; // 设置声音播放器要播放的音频剪辑
            sfxPlayers[loopIndex].Play(); // 播放音频
            break; // 找到空闲声音播放器并播放音频后跳出循环
        }
    }

    //播放BGM
    public void PlayBgm(bool isPlay)
    {
        if (isPlay)
        {
            bgmPlayer.Play();
        }
        else
        {
            bgmPlayer.Stop();
        }

    }
}